////////////////////////////////////////////////////////////////////////////////
/// @file    main.c
/// @author  AE TEAM
/// @brief   THIS FILE PROVIDES ALL THE SYSTEM FUNCTIONS.
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

// Define to prevent recursive inclusion
#define _MAIN_C_

// Files includes
#include "bsp_api.h"
#include "pincfg.h"
#include "os_obj.h"
#include "sys_task.h"

////////////////////////////////////////////////////////////////////////////////
static uint32_t volatile idle_loop_cnt;
void stack_init(void);


////////////////////////////////////////////////////////////////////////////////
/// @brief  This function is main entrance.
/// @param  None.
/// @retval  0.
////////////////////////////////////////////////////////////////////////////////
void app_main(void)
{
	stack_init();
	
	bsp_Init();
	
    tx_kernel_enter();

    while (1);
}

/*******************************************************************************
* @brief  tx_application_define : called by tx_kernel_enter.
* \param[in] first_unused_memory :mem address that is unused
* \retval: none
*******************************************************************************/
void  tx_application_define(void *first_unused_memory)
{
    os_thread_init();
}

/*******************************************************************************
* @brief  app_task_start : task entry.
* \param[in] thread_input : argv
* \retval: none
*******************************************************************************/
void  app_task_start(ULONG thread_input)
{
    (void)thread_input;

    os_thread_creat();

    //app tick run
    app_tick_resume();

    while (1)
    {
        tx_thread_sleep(1000);
    }
}

/*******************************************************************************
* @brief  app_task_stat : task entry.
* \param[in] thread_input : argv
* \retval: none
*******************************************************************************/
void app_task_stat(ULONG thread_input)
{
    uint32_t cal;

    (void)thread_input;
	
    for (;;)
    {
        cal = idle_loop_cnt;		/* 获得1000ms内空闲计数 */
        idle_loop_cnt = 0uL;        /* 复位空闲计数 */

        cal *= 100;
		
        sys_st.f_cpu_usage = 100.0f - (float)cal * 10 / 1000000;
        
        tx_thread_sleep(ms_ticks(1000));        /* 每1s统计一次 */
    }
}

/*******************************************************************************
* @brief  app_task_idle : task entry.
* \param[in] thread_input : argv
* \retval: none
*******************************************************************************/
void app_task_idle(ULONG thread_input)
{
    TX_INTERRUPT_SAVE_AREA;

    (void)thread_input;
    NOP1();
    EvenU8(0x55);

idle_loop_start:
    //计算指令数保证该段执行10us
    TX_DISABLE;					//	
    idle_loop_cnt++;			//	
    TX_RESTORE; 				//	14
	NOP40(); NOP40(); NOP40();NOP40();NOP8();
    NOP40(); NOP40(); NOP40();NOP40();NOP8();
	NOP40(); NOP40(); NOP40();NOP40();NOP8();
    NOP40(); NOP40(); NOP40();NOP40();NOP8();
	NOP40(); NOP40(); NOP40();NOP40();NOP8();
    NOP40(); NOP40(); NOP40();NOP40();NOP8();
	NOP40(); NOP40(); NOP40();NOP40();NOP8();
    NOP40(); NOP40(); NOP40();NOP40();NOP8();
	NOP40(); NOP40(); NOP40();NOP40();NOP8();
	NOP40(); NOP40(); NOP40();NOP20();			// 120 * 10
	sys_st.info.srand[0]+=SysTick->VAL * 41414141;		// 4
	sys_st.info.srand[1]+=SysTick->VAL * 19191919;		// 4
    goto idle_loop_start;		//1 // 清流水线 4
}
/// @}

/// @}

/// @}
